package com.example.shiro;

import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.cache.MemoryConstrainedCacheManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

//shiro配置类文件
@Configuration
public class ShiroConfig {

    //    创建realm
    @Bean
    public CustomRealm getRealm() {
        CustomRealm customRealm = new CustomRealm();
//        缓存设置
        customRealm.setCacheManager(cacheManager());
        return new CustomRealm();
    }

    @Bean
    public SessionDAO sessionDAO() {
//        MemorySessionDAO是shiro已经实现的Session的CRUD实现类，
//        包括对session的操作，增删改读。
        //使用默认的MemorySessionDAO
//        可以在其他的类中引入这个sessionDAO 然后使用方法
//        Session session = sessionDAO().readSession("1");
//        session.setTimeout(0);   //强制退出操作
        return new MemorySessionDAO();
    }

    //    创建安全管理器  管理所有的
    @Bean
    public SecurityManager getSecurityManager(CustomRealm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(realm);
        securityManager.setRealm(realm);
//        启用shiro缓存器设置
        securityManager.setCacheManager(cacheManager());
//        启用shiro session的管理
        securityManager.setSessionManager(sessionManager());
        return securityManager;
    }


    /**
     * shiro session的管理
     */
    @Bean
    public SessionManager sessionManager() {
        // 将我们继承后重写的shiro session 注册
        MySessionManager sessionManager = new MySessionManager();
        sessionManager.setGlobalSessionTimeout(1000 * 60 * 600);  //一分钟
        sessionManager.setSessionValidationSchedulerEnabled(true);
        sessionManager.setSessionIdCookieEnabled(true);
        sessionManager.setSessionDAO(sessionDAO());
//        自带的缓存器
        sessionManager.setCacheManager(cacheManager());
        return sessionManager;
    }

    //    启用shiro 缓存
    @Bean
    protected CacheManager cacheManager() {
        return new MemoryConstrainedCacheManager();
    }

    //    创建过滤器工厂
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
//        通过过滤器集合控制
//        创建工厂
        ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
//        设置安全管理器
        filterFactory.setSecurityManager(securityManager);
//        设置通用的配置
//        filterFactory.setLoginUrl("/realm");  //未登录则跳转的地址
//        filterFactory.setUnauthorizedUrl("/per");  //授权失败
//        设置过滤集合

//        过滤器
        Map<String , Filter> filters = new HashMap<>();
        filters.put("authc",new ShiroUserFilter());
        filters.put("perms",new ShiroRoleFilter());
        filterFactory.setFilters(filters);


        LinkedHashMap<String, String> map = new LinkedHashMap<>();
//        自己设置
        map.put("/login", "anon");
        map.put("/forget", "anon");
        map.put("/test/**", "anon");
        map.put("/random", "anon");
        map.put("/root/**", "perms[admin]");
        map.put("/boos/**", "anon");
        map.put("/removeAll/**", "perms[root]");
        map.put("/**", "authc");
//        自定义
//        返回
        filterFactory.setFilterChainDefinitionMap(map);
        return filterFactory;
    }
}
